﻿using MesBSW.DAL.MesDB;
using MesBSW.DAL.MesDTO;
using MesBSW.View;
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;

namespace MesBSW.BLL.Mes
{
    public class ProdProcessControler : BaseControler
    {
        /// <summary>
        /// 根据工单号查询工单信息
        /// </summary>
        /// <param name="prodList"></param>
        /// <returns></returns>
        public List<SourceProdProcess> SearchTargetProdForList(List<string> prodList)
        {
            List<SourceProdProcess> resList = new List<SourceProdProcess>();
            using (MesDB ctx = new MesDB())
            {
                var query = ctx.SourceProdProcesses.Where(q => prodList.Contains(q.ProdNumber));
                resList = query != null && query.Count() > 0 ? query.ToList<SourceProdProcess>() : new List<SourceProdProcess>();
            }
            return resList;
        }


        /// <summary>
        /// 根据物料编号查询物料信息
        /// </summary>
        /// <param name="matList"></param>
        /// <returns></returns>
        public List<MatInfo> SearchGoodsInfoForList(List<string> matList)
        {
            List<MatInfo> resList = new List<MatInfo>();
            using (MesDB ctx = new MesDB())
            {
                var query = ctx.MatInfos.Where(q => matList.Contains(q.mat_number));
                resList = query != null && query.Count() > 0 ? query.ToList<MatInfo>() : new List<MatInfo>();
            }
            return resList;
        }


        public int SaveSourceProdForInputKingdee(List<SourceProdProcessDTO> sourceList)
        {
            int count = 0;
            DateTime tmpDay = this.GetCurrDateTime();
            using (MesDB ctx = new MesDB())
            {
                List<string> tmpList = sourceList.Select(q => q.ProdNumber).Distinct().ToList<string>();
                var tmpQuery1 = ctx.SourceProdProcesses.Where(q => tmpList.Contains(q.ProdNumber));
                if (tmpQuery1 != null && tmpQuery1.Count() > 0)
                {
                    throw new Exception($"工单：{tmpQuery1.First().ProdNumber} 已经存在于资料中，中止保存！");
                }
                var tmpQuery2 = ctx.TargetProdProcesses.Where(q => tmpList.Contains(q.ProdNumber));
                if (tmpQuery2 != null && tmpQuery2.Count() > 0)
                {
                    throw new Exception($"工单：{tmpQuery1.First().ProdNumber} 已经存在于目标工单中，中止保存！");
                }

                foreach (var item in sourceList)
                {
                    var tran = ctx.Database.BeginTransaction();
                    try
                    {
                        SourceProdProcess sourceBean = new SourceProdProcess();
                        Tools.EntityTools.CopyEntity<SourceProdProcessDTO, SourceProdProcess>(item, ref sourceBean);
                        sourceBean.CreateUser = MainFrm.LoginUser.user_name;
                        sourceBean.CreateDate = tmpDay;
                        ctx.SourceProdProcesses.Add(sourceBean);
                        ctx.SaveChanges();

                        if (item.targetList != null && item.targetList.Count > 0)
                        {
                            foreach (var target in item.targetList)
                            {
                                TargetProdProcess targetBean = new TargetProdProcess();
                                Tools.EntityTools.CopyEntity<TargetProdProcessDTO, TargetProdProcess>(target, ref targetBean);
                                targetBean.ParentID = sourceBean.ID;
                                targetBean.CreateUser = MainFrm.LoginUser.user_name;
                                targetBean.CreateDate = tmpDay;
                                ctx.TargetProdProcesses.Add(targetBean);
                                ctx.SaveChanges();

                                if (target.SiteGroup != null)
                                {
                                    ProdProcSite ppSiteBean = new ProdProcSite();
                                    ppSiteBean.ProdProcID = targetBean.ID;
                                    ppSiteBean.SiteGroupID = target.SiteGroup.ID;
                                    ppSiteBean.CreateUser = MainFrm.LoginUser.user_name;
                                    ppSiteBean.CreateDate = tmpDay;
                                    ctx.ProdProcSites.Add(ppSiteBean);
                                    ctx.SaveChanges();
                                }
                            }
                        }

                        tran.Commit();
                        count++;
                    }
                    catch (Exception ex)
                    {
                        tran.Rollback();
                        throw new Exception("保存异常！" + "\r\n" + "问题工单：" + item.ProdNumber + "\r\n" + ex.Message);
                    }
                }
            }
            return count;
        }


        ///// <summary>
        ///// 判断工单的加工方法
        ///// </summary>
        ///// <param name="matNum">物料编号</param>
        ///// <param name="prodNo">工单号</param>
        ///// <returns>不防水、内部加工或外部加工</returns>
        //public string JudgeProdRawPM(string matNum)
        //{
        //    string rawStr = "";
        //    if (matNum != null && matNum.Length > 12)
        //    {
        //        string prodID = matNum.Substring(4, 1);
        //        if (matNum.Substring(0, 2).ToUpper().Equals("ZJ") || matNum.Substring(0, 2).ToUpper().Equals("PJ"))
        //        {
        //            rawStr = "配件与组件";
        //        }
        //        else if (prodID.Equals("1"))
        //        {
        //            if (matNum.Length > 4)
        //            {
        //                string tmpStr = matNum.Substring(3, 1);
        //                if (tmpStr.Equals("N"))
        //                {
        //                    rawStr = "不防水";
        //                }
        //                else if (tmpStr.Equals("H") || tmpStr.Equals("K") || tmpStr.Equals("M") || tmpStr.Equals("P") || tmpStr.Equals("Q"))
        //                {
        //                    rawStr = "外发加工";
        //                }
        //                else if (tmpStr.Equals("A") || tmpStr.Equals("B") || tmpStr.Equals("C") || tmpStr.Equals("D") || tmpStr.Equals("E") || tmpStr.Equals("F") || tmpStr.Equals("G") || tmpStr.Equals("J") || tmpStr.Equals("L"))
        //                {
        //                    rawStr = "内部加工";
        //                }
        //            }
        //        } 
        //        else if (prodID.Equals("4"))
        //        {
        //            string tmpStr = matNum.Substring(13, 1);
        //            if (tmpStr.Equals("1"))
        //            {
        //                rawStr = "不防水";
        //            }
        //            else if (tmpStr.Equals("5"))
        //            {
        //                rawStr = "外发加工";
        //            }
        //            else 
        //            {
        //                rawStr = "内部加工";
        //            }
        //        }
        //    }

        //    return rawStr;
        //}


        //public SiteGroup JudgeSiteGroupForGoods(string goodsNumber, string goodsSpe)
        //{
        //    List<SiteGroup> siteGroupList = this.SearchAllSiteGroup();
        //    if (siteGroupList != null && siteGroupList.Count > 0)
        //    {
        //        siteGroupList = siteGroupList.Where(g => g.IsDel != 1).ToList();
        //    }

        //    SiteGroup resSiteGroupBean = null;
        //    string tmpGroupName = "GL01_SG001";
        //    if (goodsNumber != null && goodsNumber.Length > 12)
        //    {
        //        if (goodsNumber.Substring(0, 2).ToUpper().Equals("ZJ") || goodsNumber.Substring(0, 2).ToUpper().Equals("PJ"))
        //        {
        //            tmpGroupName = "GL01_SG008";
        //        }
        //        else
        //        {
        //            string rawFlag = "不防水";
        //            if (goodsNumber.Substring(4, 1) == "1")
        //            {
        //                rawFlag = goodsNumber.Substring(3, 1).ToUpper() == "N" ? "不防水" : "防水";
        //                if (goodsSpe.ToUpper().Contains("COB"))
        //                {
        //                    if (goodsNumber.Substring(6, 2).ToUpper().Equals("ZZ"))
        //                    {
        //                        tmpGroupName = rawFlag.Equals("不防水") ? "GL01_SG003" : "GL01_SG006";
        //                    }
        //                    else
        //                    {
        //                        tmpGroupName = rawFlag.Equals("不防水") ? "GL01_SG001" : "GL01_SG002";
        //                    }
        //                }
        //                else
        //                {
        //                    tmpGroupName = rawFlag.Equals("不防水") ? "GL01_SG001" : "GL01_SG002";
        //                }
        //            }
        //            else if (goodsNumber.Substring(4, 1) == "4")
        //            {
        //                rawFlag = goodsNumber.Substring(13, 1) == "1" ? "不防水" : goodsNumber.Substring(13, 1) == "5" ? "外发加工" : "内部加工";
        //                if (goodsSpe.ToUpper().Contains("COB"))
        //                {
        //                    tmpGroupName = rawFlag.Equals("不防水") ? "GL01_SG003" : "GL01_SG006";         //线四、COB产品都走外购流程：不防水走外购COB不防水流程；防水走外购COB防水流程
        //                }
        //                else 
        //                {
        //                    tmpGroupName = rawFlag.Equals("不防水") ? "GL01_SG001" : "GL01_SG002";
        //                }
        //            }
        //        }
        //    }

        //    if (siteGroupList != null && siteGroupList.Count > 0)
        //    {
        //        var query = siteGroupList.Where(g => g.GroupCode.Equals(tmpGroupName));
        //        if (query != null && query.Count() > 0)
        //        {
        //            resSiteGroupBean = query.First<SiteGroup>();
        //        }
        //    }

        //    return resSiteGroupBean;
        //}


        ///// <summary>
        ///// 根据工单号查询工单信息
        ///// </summary>
        ///// <param name="prodList"></param>
        ///// <returns></returns>
        //public List<TargetProdProcess> SearchTargetProdForList(List<string> prodList)
        //{
        //    List<TargetProdProcess> resList = new List<TargetProdProcess>();
        //    using (MesDB ctx = new MesDB())
        //    {
        //        var query = ctx.TargetProdProcesses.Where(q => prodList.Contains(q.ProdNumber));
        //        if (query != null && query.Count() > 0)
        //        {
        //            resList = query.ToList<TargetProdProcess>();
        //        }
        //    }
        //    return resList;
        //}


        ///// <summary>
        ///// 取得站点组别中的第一个站点
        ///// </summary>
        ///// <param name="groupID"></param>
        ///// <returns></returns>
        //public SiteInfo SearchFirstSiteForSiteGroup(int groupID)
        //{
        //    SiteInfo siteInfo = new SiteInfo();
        //    using (MesDB ctx = new MesDB())
        //    {
        //        var query = from a in ctx.SiteGroups
        //                    join b in ctx.SiteInfoGroups on a.ID equals b.GroupID
        //                    join c in ctx.SiteInfos on b.SiteID equals c.ID
        //                    where a.ID == groupID && b.Sort == 1
        //                    select c;
        //        if (query != null && query.Count() > 0)
        //        {
        //            siteInfo = query.First();
        //        }
        //    }
        //    return siteInfo;
        //}


        ///// <summary>
        ///// 查询所有站点组别
        ///// </summary>
        ///// <returns></returns>
        //public List<SiteGroup> SearchAllSiteGroup()
        //{
        //    List<SiteGroup> resList = new List<SiteGroup>();
        //    using (MesDB ctx = new MesDB())
        //    {
        //        var query = ctx.SiteGroups;
        //        if (query != null && query.Count() > 0)
        //        {
        //            resList.AddRange(query);
        //        }
        //    }
        //    return resList;
        //}


        ///// <summary>
        ///// 查询工单预设的交期资料
        ///// </summary>
        ///// <param name="prodNo"></param>
        ///// <returns></returns>
        //public SourceProdProcess SearchSourcePPForProdNo(string prodNo)
        //{
        //    SourceProdProcess resBean = new SourceProdProcess();
        //    using (MesDB ctx = new MesDB())
        //    {
        //        var query = ctx.SourceProdProcesses.Where(s => s.ProdNumber.Equals(prodNo));
        //        if (query != null && query.Count() > 0)
        //        {
        //            resBean = query.First();    
        //        }
        //    }
        //    return resBean;
        //}

        ///// <summary>
        ///// 根据原始工单查询目标工单
        ///// </summary>
        ///// <param name="prodNo">原始工单号</param>
        ///// <returns></returns>
        //public List<TargetProdProcessDTO> SearchTargetLikeProdNo(string prodNo)
        //{
        //    List<TargetProdProcessDTO> resList = new List<TargetProdProcessDTO>();
        //    using (MesDB ctx = new MesDB())
        //    {
        //        var query = from a in ctx.TargetProdProcesses
        //                    join b in ctx.TargetPPCycle on a.ID equals b.TargetID into res1
        //                    from ab in res1.DefaultIfEmpty()
        //                    join c in ctx.ProdProcSites on a.ID equals c.ProdProcID into res2
        //                    from ac in res2.DefaultIfEmpty()
        //                    join d in ctx.SiteGroups on ac.SiteGroupID equals d.ID into res3
        //                    from cd in res3.DefaultIfEmpty()
        //                    where prodNo.Contains(a.ProdNumber)
        //                    select new { A = a, AB = ab, AC = ac, CD = cd };
        //        if (query != null && query.Count() > 0)
        //        {
        //            foreach (var item in query)
        //            {
        //                TargetProdProcessDTO resBean = new TargetProdProcessDTO();
        //                EntityTools.CopyEntity<TargetProdProcess, TargetProdProcessDTO>(item.A,ref resBean);

        //                if (item.AB != null)
        //                {
        //                    resBean.TargetCycle = item.AB;
        //                }

        //                if (item.CD != null)
        //                {
        //                    SiteGroupDTO groupBean = new SiteGroupDTO();
        //                    EntityTools.CopyEntity<SiteGroup, SiteGroupDTO>(item.CD, ref groupBean);
        //                    resBean.SiteGroup = groupBean;

        //                    var siteQuery = from a in ctx.SiteGroups
        //                                    join b in ctx.SiteInfoGroups on a.ID equals b.GroupID into res4
        //                                    from ab in res4
        //                                    join c in ctx.SiteInfos on ab.SiteID equals c.ID into res5
        //                                    from bc in res5
        //                                    where a.ID == groupBean.ID
        //                                    orderby ab.Sort
        //                                    select new { A = a, AB = ab, BC = bc };
        //                    if (siteQuery != null && siteQuery.Count() > 0)
        //                    {
        //                        resBean.SiteGroup.SiteInfoList = new List<SiteInfoGroupDTO>();
        //                        foreach (var siteItem in siteQuery)
        //                        {
        //                            SiteInfoGroupDTO siteInfoGroup = new SiteInfoGroupDTO();
        //                            EntityTools.CopyEntity<SiteInfoGroup, SiteInfoGroupDTO>(siteItem.AB, ref siteInfoGroup);

        //                            siteInfoGroup.SiteInfo = siteItem.BC;
        //                            resBean.SiteGroup.SiteInfoList.Add(siteInfoGroup);
        //                        }
        //                    }
        //                }

        //                resList.Add(resBean);
        //            }
        //        }           
        //    }
        //    return resList;
        //}


        //public TargetProdProcessDTO SearchTargetPPForProdNo(string prodNo)
        //{
        //    TargetProdProcessDTO resBean = new TargetProdProcessDTO();
        //    using (MesDB ctx = new MesDB())
        //    {
        //        var targetQuery = from a in ctx.TargetProdProcesses
        //                          join b in ctx.ProdProcSites on a.ID equals b.ProdProcID into res
        //                          from ab in res.DefaultIfEmpty()
        //                          join c in ctx.SiteGroups on ab.SiteGroupID equals c.ID into res1
        //                          from bc in res1.DefaultIfEmpty()
        //                          where a.ProdNumber.Equals(prodNo)
        //                          select new { A = a, B = ab, C = bc };
        //        if (targetQuery != null && targetQuery.Count() > 0)
        //        {
        //            EntityTools.CopyEntity(targetQuery.First().A, ref resBean);
        //            SiteGroupDTO site = new SiteGroupDTO();
        //            if (targetQuery.First().B != null)
        //            {
        //                EntityTools.CopyEntity(targetQuery.First().C, ref site);
        //                resBean.SiteGroup = site;
        //            }
        //        }
        //    }
        //    return resBean;
        //}

        //public TargetPPCycle SearchTargetCycleByProdNo(string prodNo)
        //{
        //    TargetPPCycle resBean = new TargetPPCycle();
        //    using (MesDB ctx = new MesDB())
        //    {
        //        var query = ctx.TargetPPCycle.Where(t => t.ProdNumber.Equals(prodNo));
        //        if (query != null && query.Count() > 0)
        //        {
        //            resBean = query.First();
        //        }
        //    }
        //    return resBean;
        //}


        ///// <summary>
        ///// 根据工单号查询原料工单和拆分后的工单资料
        ///// </summary>
        ///// <param name="billno"></param>
        ///// <returns></returns>
        //public SourceProdProcessDTO SearchProdProcessByBillNo(string billno)
        //{
        //    SourceProdProcessDTO resBean = new SourceProdProcessDTO();
        //    using (MesDB ctx = new MesDB())
        //    {
        //        //查询原始工单
        //        var query = ctx.SourceProdProcesses.Where(s => s.ProdNumber == billno);
        //        if (query != null && query.Count() > 0)
        //        {
        //            EntityTools.CopyEntity<SourceProdProcess,SourceProdProcessDTO>(query.First<SourceProdProcess>(),ref resBean);
        //            if (resBean != null)
        //            {
        //                //如果原始工单已经录入到MES系统中，继续查找是否有拆分单据
        //                var targetQuery = from a in ctx.TargetProdProcesses
        //                                  join b in ctx.ProdProcSites on a.ID equals b.ProdProcID into res
        //                                  from ab in res.DefaultIfEmpty()
        //                                  join c in ctx.SiteGroups on ab.SiteGroupID equals c.ID into res1
        //                                  from bc in res1.DefaultIfEmpty()
        //                                  where a.ParentID == resBean.ID
        //                                  select new { A = a, B = ab, C = bc };
        //                resBean.targetList = new List<TargetProdProcessDTO>();
        //                if (targetQuery != null && targetQuery.Count() > 0)
        //                {
        //                    foreach (var item in targetQuery)
        //                    {
        //                        TargetProdProcessDTO target = new TargetProdProcessDTO();
        //                        EntityTools.CopyEntity(item.A,ref target);
        //                        SiteGroupDTO site = new SiteGroupDTO();
        //                        if (item.B != null)
        //                        {
        //                            EntityTools.CopyEntity(item.C,ref site);
        //                            target.SiteGroup = site;
        //                        }
        //                        resBean.targetList.Add(target);
        //                    }
        //                }
        //            }
        //        }
        //    }
        //    return resBean;
        //}


        //public TargetProdProcess SearchTargetProdProcessByPordNumber(string prodNumber)
        //{
        //    using (MesDB ctx = new MesDB())
        //    {
        //        var query = ctx.TargetProdProcesses.Where(p => p.ProdNumber == prodNumber);
        //        if (query != null && query.Count() > 0)
        //        {
        //            return query.First<TargetProdProcess>();
        //        }
        //        else
        //        {
        //            return null;
        //        }
        //    }
        //}


        //public int SaveProdProcessForFirstScan(ProdProcScan scan)
        //{
        //    int count = 0;
        //    if (scan != null)
        //    {
        //        using (MesDB ctx = new MesDB())
        //        {
        //            var scanQuery = from a in ctx.ProdProcScans
        //                            join b in ctx.SiteInfos on a.SiteInfoID equals b.ID into res1
        //                            from ab in res1.DefaultIfEmpty()
        //                            join c in ctx.TargetProdProcesses on a.ProdProcID equals c.ID into res2
        //                            from ac in res2.DefaultIfEmpty()
        //                            join d in ctx.StatusInfos on a.StatusInfoID equals d.ID into res3
        //                            from ad in res3.DefaultIfEmpty()
        //                            where a.ProdProcID == scan.ProdProcID && a.SiteInfoID == scan.SiteInfoID
        //                            where ad.StatusValue.Contains("异常") == false
        //                            select new { A = a, AB = ab, AC = ac, AD = ad};
        //            if (scanQuery != null && scanQuery.Count() > 0)
        //            {
        //                throw new Exception("工单：" + scanQuery.First().AC.ProdNumber + "\r\n" +
        //                                        "站点：" + scanQuery.First().AB.SiteName + "\r\n" + "该站点已扫过码！");
        //            }
        //            else
        //            {
        //                scan.ScanUser = MainFrm.LoginUser.user_name;
        //                scan.ScanDate = GetCurrDateTime();
        //                scan.IsComp = 0;
        //                ctx.ProdProcScans.Add(scan);
        //                count = ctx.SaveChanges();
        //                return count;
        //            }
        //        }
        //    }
        //    else
        //    {
        //        throw new Exception("传入的扫码资料为空，扫码失败！");
        //    }
        //}


        ///// <summary>
        ///// 保存拆分工单
        ///// </summary>
        ///// <param name="sourcePP"></param>
        ///// <param name="copyPP"></param>
        ///// <returns></returns>
        ///// <exception cref="Exception"></exception>
        //public int SaveProdProcessForSplit(SourceProdProcessDTO sourcePP,SourceProdProcessDTO copyPP)
        //{
        //    int count = 0;
        //    if (sourcePP != null)
        //    {
        //        using (MesDB ctx = new MesDB())
        //        {
        //            //打开事务
        //            using (var tran = ctx.Database.BeginTransaction())
        //            {
        //                try 
        //                {
        //                    //先保存原工单资料
        //                    SourceProdProcess spp = new SourceProdProcess();
        //                    EntityTools.CopyEntity<SourceProdProcessDTO, SourceProdProcess>(sourcePP, ref spp);
        //                    int sppID = 0;
        //                    if (sourcePP.ID == 0)
        //                    {
        //                        //如果原工单的ID主键为0，使用新增操作
        //                        spp.CreateUser = MainFrm.LoginUser.user_name;
        //                        spp.CreateDate = DateTime.Now;
        //                        ctx.SourceProdProcesses.Add(spp);
        //                    }
        //                    else if (sourcePP.ID > 0)
        //                    {
        //                        SourceProdProcess tmpSpp = new SourceProdProcess();
        //                        EntityTools.CopyEntity<SourceProdProcessDTO, SourceProdProcess>(copyPP,ref tmpSpp);
        //                        //如果原工单的ID主键不为0，使用更新操作
        //                        if (EntityTools.IsDiffForValue(spp, tmpSpp) == false)
        //                        {
        //                            //更新操作时，保存一份日志
        //                            MesLog tmpBean = this.InitMesLog("source_prod_precess", sourcePP.ID, EntityTools.GetPropNameAndValue(tmpSpp), 
        //                                                                EntityTools.GetPropNameAndValue(sourcePP),"update",MainFrm.LoginUser.user_name);
        //                            ctx.MesLogs.Add(tmpBean);

        //                            //更改实体类的状态
        //                            ctx.SourceProdProcesses.Attach(spp);
        //                            ctx.Entry<SourceProdProcess>(spp).State = System.Data.Entity.EntityState.Modified;
        //                        }
        //                    }
        //                    //保存原工单，并取得保存后数据库分配的ID主键
        //                    count += ctx.SaveChanges();
        //                    sppID = spp.ID;

        //                    //开始保存拆分后的工单
        //                    if (sourcePP.targetList != null && sourcePP.targetList.Count > 0)
        //                    {
        //                        foreach (var item in sourcePP.targetList)
        //                        {
        //                            TargetProdProcess tpp = new TargetProdProcess();
        //                            EntityTools.CopyEntity<TargetProdProcessDTO, TargetProdProcess>(item, ref tpp);

        //                            if (item.ID == 0)
        //                            {
        //                                //如果拆分工单的ID为0
        //                                //使用新增操作保存拆分工单
        //                                tpp.ParentID = sppID;
        //                                tpp.CreateDate = DateTime.Now;
        //                                tpp.CreateUser = MainFrm.LoginUser.user_name;
        //                                ctx.TargetProdProcesses.Add(tpp);
        //                                count += ctx.SaveChanges();

        //                                //因为拆分工单是新增，所以拆分工单与站点组的绑定也是新增操作
        //                                ProdProcSite PPsite = new ProdProcSite();
        //                                PPsite.ProdProcID = tpp.ID;
        //                                PPsite.SiteGroupID = item.SiteGroup.ID;
        //                                PPsite.CreateDate = DateTime.Now;
        //                                PPsite.CreateUser = MainFrm.LoginUser.user_name;
        //                                ctx.ProdProcSites.Add(PPsite);
        //                                count += ctx.SaveChanges();
        //                            }
        //                            else if (item.ID > 0)
        //                            {
        //                                //如果拆分工单的ID不为0，证明拆分工单资料已经存在于数据库，先按ID在数据库中获取拆分工单资料
        //                                TargetProdProcess tmpTpp = new TargetProdProcess();
        //                                if (copyPP != null && copyPP.targetList != null && copyPP.targetList.Count > 0)
        //                                {
        //                                    var tppQuery = copyPP.targetList.Where(t => t.ID == item.ID);
        //                                    if (tppQuery != null && tppQuery.Count() > 0)
        //                                    {
        //                                        EntityTools.CopyEntity(tppQuery.First(),ref tmpTpp);
        //                                    }
        //                                }

        //                                //对比资料，如果资料对不上，使用更新操作保存拆分工单
        //                                if (EntityTools.IsDiffForValue(tmpTpp, tpp) == false)
        //                                {
        //                                    //保存更新拆分工单的日志
        //                                    MesLog tmpBean = this.InitMesLog("target_prod_precess", item.ID, EntityTools.GetPropNameAndValue(tmpTpp), 
        //                                                                        EntityTools.GetPropNameAndValue(tpp), "update", MainFrm.LoginUser.user_name);
        //                                    ctx.MesLogs.Add(tmpBean);

        //                                    //更改拆分工单的状态，准备更新操作
        //                                    ctx.Set<TargetProdProcess>().Attach(tpp);
        //                                    ctx.Entry<TargetProdProcess>(tpp).State = System.Data.Entity.EntityState.Modified;
        //                                }
        //                                count += ctx.SaveChanges();

        //                                //查询拆分工单与站点组原来的绑定状态
        //                                var siteQuery = ctx.ProdProcSites.Where(ps => ps.ProdProcID == item.ID);
        //                                if (siteQuery != null && siteQuery.Count() > 0)
        //                                {
        //                                    //如果有已有绑定状态，检查原来绑定的站点组与现在绑定的站点组ID是否一致，不致的就更新绑定状态，并保留日志
        //                                    if (siteQuery.First().SiteGroupID != item.SiteGroup.ID)
        //                                    {
        //                                        MesLog tmpBean1 = new MesLog();
        //                                        tmpBean1.TableName = "pp_site";
        //                                        tmpBean1.TableID = siteQuery.First().ID;
        //                                        tmpBean1.BeforeData = EntityTools.GetPropNameAndValue(siteQuery.First());
        //                                        tmpBean1.AfterData = EntityTools.GetPropNameAndValue(item.ProdStatus);
        //                                        tmpBean1.ChangeType = "update";
        //                                        tmpBean1.ChangeDate = DateTime.Now;
        //                                        tmpBean1.ChangeUser = MainFrm.LoginUser.user_name;
        //                                        ctx.MesLogs.Add(tmpBean1);

        //                                        ProdProcSite tmpSite = siteQuery.First();
        //                                        tmpSite.SiteGroupID = item.SiteGroup.ID;
        //                                        ctx.ProdProcSites.Attach(tmpSite);
        //                                        ctx.Entry<ProdProcSite>(tmpSite).State = System.Data.Entity.EntityState.Modified;
        //                                    }
        //                                }
        //                                else
        //                                {
        //                                    //如果没有绑定状态，新增
        //                                    ProdProcSite PPsite = new ProdProcSite();
        //                                    PPsite.ProdProcID = item.ID;
        //                                    PPsite.SiteGroupID = item.SiteGroup.ID;
        //                                    PPsite.CreateDate = DateTime.Now;
        //                                    PPsite.CreateUser = MainFrm.LoginUser.user_name;
        //                                    ctx.ProdProcSites.Add(PPsite);
        //                                }
        //                                count += ctx.SaveChanges();
        //                            }

        //                            var query = ctx.TargetPPCycle.Where(t => t.ProdNumber == item.ProdNumber);
        //                            if (query == null || query.Count() <= 0)
        //                            { 
        //                                TargetPPCycle tmpCycle = new TargetPPCycle();
        //                                tmpCycle.ID = 0;
        //                                tmpCycle.TargetID = tpp.ID;
        //                                tmpCycle.ProdNumber = item.ProdNumber;
        //                                tmpCycle.IsProdSchedul = 0;
        //                                tmpCycle.CreateUser = MainFrm.LoginUser.user_name;
        //                                tmpCycle.CreateDate = GetCurrDateTime();

        //                                ctx.TargetPPCycle.Add(tmpCycle);

        //                                count += ctx.SaveChanges();
        //                            }
        //                        }
        //                    }
        //                    tran.Commit();
        //                    return count;
        //                }
        //                catch (Exception ex)
        //                {
        //                    tran.Rollback();
        //                    throw ex;
        //                }
        //            }
        //        }
        //    }
        //    else
        //    {
        //        throw new Exception("传入的工单对像为空，中止保存！");
        //    }
        //}


        ///// <summary>
        ///// 删除拆分工单
        ///// </summary>
        ///// <param name="targetID"></param>
        ///// <returns></returns>
        ///// <exception cref="Exception"></exception>
        //public int DeleteTargetProdProcess(int targetID)
        //{
        //    int count = 0;
        //    using (MesDB ctx = new MesDB())
        //    {
        //        var scanQuery = ctx.ProdProcScans.Where(s => s.ProdProcID == targetID);
        //        if (scanQuery != null && scanQuery.Count() > 0)
        //        {
        //            throw new Exception("工单已经开始扫码，不能删除！");
        //        }
        //        else
        //        {
        //            var siteQuery = ctx.ProdProcSites.Where(s => s.ProdProcID == targetID);
        //            if (siteQuery != null && siteQuery.Count() > 0)
        //            {
        //                ProdProcSite ppSite = siteQuery.First();
        //                MesLog tmpLog = new MesLog();
        //                tmpLog.TableName = "pp_site";
        //                tmpLog.TableID = ppSite.ID;
        //                tmpLog.BeforeData = EntityTools.GetPropNameAndValue(ppSite);
        //                tmpLog.AfterData = "";
        //                tmpLog.ChangeType = "delete";
        //                tmpLog.ChangeUser = MainFrm.LoginUser.user_name;
        //                tmpLog.ChangeDate = DateTime.Now;
        //                ctx.MesLogs.Add(tmpLog);

        //                ctx.Entry<ProdProcSite>(ppSite).State = System.Data.Entity.EntityState.Deleted;
        //            }

        //            var ppQuery = ctx.TargetProdProcesses.Where(p => p.ID == targetID);
        //            if (ppQuery != null && ppQuery.Count() > 0)
        //            {
        //                TargetProdProcess tmpBean = ppQuery.First();
        //                MesLog tmpLog = new MesLog();
        //                tmpLog.TableName = "target_prod_process";
        //                tmpLog.TableID = tmpBean.ID;
        //                tmpLog.BeforeData = EntityTools.GetPropNameAndValue(tmpBean);
        //                tmpLog.AfterData = "";
        //                tmpLog.ChangeType = "delete";
        //                tmpLog.ChangeUser = MainFrm.LoginUser.user_name;
        //                tmpLog.ChangeDate = DateTime.Now;
        //                ctx.MesLogs.Add(tmpLog);

        //                ctx.Entry<TargetProdProcess>(tmpBean).State = System.Data.Entity.EntityState.Deleted;
        //            }
        //            count = ctx.SaveChanges();
        //        }
        //    }
        //    return count;
        //}


        ///// <summary>
        ///// 查询扫码超过三天后就没有扫，而且工单当前站点又不在包装结束站的工单
        ///// </summary>
        ///// <returns></returns>
        //public DataTable SearchRedundanceProd()
        //{
        //    //取得服务器日期的前三天
        //    DateTime tmpDay = this.GetCurrDateTime().AddDays(-3).Date;

        //    //定义返回的DataTable栏位
        //    DataTable resDt = new DataTable();
        //    resDt.Columns.Add("id", typeof(int));
        //    resDt.Columns.Add("prod_number", typeof(string));
        //    resDt.Columns.Add("mto_number", typeof(string));
        //    resDt.Columns.Add("max_date", typeof(string));
        //    resDt.Columns.Add("goods_number", typeof(string));
        //    resDt.Columns.Add("goods_name", typeof(string));
        //    resDt.Columns.Add("goods_spe", typeof(string));
        //    resDt.Columns.Add("goods_length", typeof(decimal));
        //    resDt.Columns.Add("prod_qty", typeof(decimal));
        //    resDt.Columns.Add("curr_site_id", typeof(int));
        //    resDt.Columns.Add("curr_site_name", typeof(string));
        //    resDt.Columns.Add("scan_date", typeof(string));
        //    resDt.Columns.Add("date_diff", typeof(int));


        //    using (MesDB ctx = new MesDB())
        //    {
        //        //查询数据
        //        var query = from a in ctx.TargetProdProcesses
        //                    join b in (
        //                        from c in ctx.ProdProcScans
        //                        group c by c.ProdNumber into g
        //                        select new
        //                        {
        //                            prod_number = g.Key,
        //                            scan_date = g.Max(x => x.ScanDate)
        //                        }
        //                    ) on a.ProdNumber equals b.prod_number into res1
        //                    from ab in res1
        //                    join d in ctx.SourceProdProcesses on a.ParentID equals d.ID into res2
        //                    from ad in res2.DefaultIfEmpty()
        //                    join e in ctx.SourcePPCycle on ad.ID equals e.SourceID into res3
        //                    from de in res3.DefaultIfEmpty()
        //                    join f in ctx.SiteInfos on a.CurrSiteID equals f.ID into res4
        //                    from af in res4.DefaultIfEmpty()
        //                    where DbFunctions.TruncateTime(ab.scan_date) < tmpDay
        //                    where a.CurrSiteID != 20
        //                    select new { A = a, AB = ab, DE = de , AF = af};

        //        //判断数据是否为空，不为空时，将数据放到DataTable中
        //        if (query != null && query.Count() > 0)
        //        {
        //            foreach (var item in query)
        //            {
        //                DataRow addRow = resDt.NewRow();
        //                addRow["id"] = item.A.ID;
        //                addRow["prod_number"] = item.A.ProdNumber;
        //                addRow["mto_number"] = item.A.MtoNumber;
        //                addRow["max_date"] = item.DE != null && item.DE.MaxDate.HasValue == true ? ((DateTime)item.DE.MaxDate).ToString("yyyy-MM-dd") : "";
        //                addRow["goods_number"] = item.A.GoodsNumber;
        //                addRow["goods_name"] = item.A.GoodsName;
        //                addRow["goods_spe"] = item.A.GoodsSpe;
        //                addRow["goods_length"] = item.A.GoodsLength.HasValue == true ? (decimal)item.A.GoodsLength : 0;
        //                addRow["prod_qty"] = item.A.ProdQty.HasValue == true ? Math.Round((decimal)item.A.ProdQty, 4) : 0;
        //                addRow["curr_site_id"] = item.A.CurrSiteID;
        //                addRow["curr_site_name"] = item.AF != null ? item.AF.SiteName : "";
        //                addRow["scan_date"] = item.AB != null ? item.AB.scan_date.ToString("yyyy-MM-dd") : "";
        //                addRow["date_diff"] = 0;
        //                resDt.Rows.Add(addRow);
        //            }
        //        }
        //    }
        //    return resDt;
        //}
    }
}
